package com.xch.service;

import com.xch.bean.Express;
import com.xch.dao.BaseExpressDao;
import com.xch.dao.impl.ExpressDaoMysql;
import com.xch.exception.DuplicateCodeException;
import com.xch.util.RandomUtil;
import com.xch.util.SMSUtil;

import java.util.List;
import java.util.Map;

public class ExpressService{
    private static BaseExpressDao dao = new ExpressDaoMysql();
    /**
     * 用于查询数据库中的全部快递（总数+新增），待取件快递（总数+新增）
     *
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     */
    public static List<Map<String, Integer>> console() {
        return dao.console();
    }

    /**
     * 用于查询所有快递
     *
     * @param limit      是否分页标记，true 分页，false 不分页 查询所有快递
     * @param offset     sql语句的起始索引
     * @param pageNumber 每页查询数量
     * @return 快递集合
     */
    public static List<Express> findAll(boolean limit, int offset, int pageNumber) {
        return dao.findAll(limit,offset,pageNumber);
    }

    /**
     * 根据快递单号查询快递信息
     *
     * @param number 单号
     * @return 快递信息，不存在时，返回null
     */
    public static Express findByNumber(String number) {
        return dao.findByNumber(number);
    }

    /**
     * 根据快递取件码查询快递信息
     *
     * @param code 取件码
     * @return 快递信息，不存在时，返回null
     */
    public static Express findByCode(String code) {
        return dao.findByCode(code);
    }

    /**
     * 根据手机号查询快递信息
     *
     * @param userPhone 取件码
     * @return 快递信息列表，不存在时，返回null
     */
    public static List<Express> findByUserPhone(String userPhone) {
        return dao.findByUserPhone(userPhone);
    }

    /**
     * 根据手机号查询快递信息
     *
     * @param userPhone 取件码
     * @return 快递信息列表，不存在时，返回null
     */
    public static List<Express> findByUserPhoneAndStatus(String userPhone,int status) {
        return dao.findByUserPhoneAndStatus(userPhone,status);
    }

    /**
     * 根据录入人手机号查询快递信息
     *
     * @param sysPhone 取件码
     * @return 快递信息列表，不存在时，返回null
     */
    public static List<Express> findBySysPhone(String sysPhone) {
        return dao.findBySysPhone(sysPhone);
    }

    /**
     * 快递的录入
     *
     * @param e 要录入的对象
     * @return 录入的结果
     */
    public static boolean insert(Express e) {
        e.setCode(RandomUtil.getCode()+"");
        try {
            boolean flag = dao.insert(e);
            if(flag){
                //发送取件码，这里暂无
//                SMSUtil.send(e.getUserPhone(),e.getCode());
            }
            return flag;
        } catch (DuplicateCodeException ex) {
            return insert(e);
        }
    }

    /**
     * 快递的修改
     *
     * @param id         要修改的快递id
     * @param newExpress 要修改的快递对象(number,company,username,userPhone)
     * @return 录入的结果
     */
    public static boolean update(int id, Express newExpress) {
        if(newExpress.getUserPhone()!=null){
            dao.delete(id);
            return insert(newExpress);
        }
        else{
            boolean update = dao.update(id,newExpress);
            Express e = dao.findByNumber(newExpress.getNumber());
            if(newExpress.getStatus()==1){
                updateStatus(e.getCode());
            }
            return update;
        }
    }

    /**
     * 根据id，删除单个快递信息
     *
     * @param id 要删除的快递id
     * @return 删除的结果
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }

    /**
     * 确认取件 1表示取件完成
     *
     * @param code 取件码
     * @return 取出的结果
     */
    public static boolean updateStatus(String code) {
        return dao.updateStatus(code);
    }
}
